package mx.com.switz.dao.Impl;

import java.util.List;
import javax.sql.DataSource;
import mx.com.switz.dao.PedidoDao;
import mx.com.switz.dto.Pedido;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.jdbc.core.namedparam.BeanPropertySqlParameterSource;
import org.springframework.jdbc.core.namedparam.NamedParameterJdbcTemplate;
import org.springframework.jdbc.core.namedparam.SqlParameterSource;
import org.springframework.jdbc.core.simple.ParameterizedBeanPropertyRowMapper;
import org.springframework.jdbc.core.simple.SimpleJdbcInsert;
import org.springframework.jdbc.core.support.JdbcDaoSupport;
import org.springframework.stereotype.Repository;

@Repository
public class PedidoDaoImpl extends JdbcDaoSupport implements PedidoDao {

    private SimpleJdbcInsert simpleJdbcInsert;
    private NamedParameterJdbcTemplate namedParameterJdbcTemplate;

    @Autowired
    public PedidoDaoImpl(DataSource dataSource) {
        // se instancia plantilla con la inyeccion del datasource	    
        setDataSource(dataSource);
        simpleJdbcInsert = new SimpleJdbcInsert(getJdbcTemplate().getDataSource()).withTableName("pedido");
        this.namedParameterJdbcTemplate = new NamedParameterJdbcTemplate(dataSource);
    }

    @Override
    public void insertPedido(Pedido pedido) {
        SqlParameterSource parameters = new BeanPropertySqlParameterSource(pedido);
        simpleJdbcInsert.execute(parameters);
    }

    @Override
    public void updatePedido(Pedido pedido)// throws EjecucionException 
    {
        String sql="UPDATE PEDIDO set fecha = :fecha,"
            + "direccion = :direccion,colonia = :colonia,municipio = :municipio,"
            + "codigoPostal = :codigoPostal,"
            + "notasRecibe = :notasRecibe,total = :total WHERE clave = :clave";
        SqlParameterSource parameterSource = new BeanPropertySqlParameterSource(
                pedido);
        this.namedParameterJdbcTemplate.update(sql, parameterSource);
    }

    @Override
    public void deletePedido(Pedido pedido) //throws EjecucionException
    {
        String sql="DELETE FROM PEDIDO WHERE clave = :clave";
        SqlParameterSource parameterSource = new BeanPropertySqlParameterSource(pedido);
        this.namedParameterJdbcTemplate.update(sql, parameterSource);
    }

    @Override
    public List selectPedidoByNombre(Pedido pedido) {
        String sql = "select clave,claveEmpresa,fecha,direccion,colonia,municipio,"
            + "codigoPostal,claveUsuario,notasRecibe,total,fechaPedido,fechaEntrega,"
            + "nombrePersonaEntregar,status from pedido"+ " WHERE fecha = :fecha";
        SqlParameterSource parameterSource = new BeanPropertySqlParameterSource(pedido);
        return namedParameterJdbcTemplate.query(sql, parameterSource, ParameterizedBeanPropertyRowMapper.newInstance(Pedido.class));
        // Esta es otra forma sin utilizar la clase PedidoRowMapper	
    }

    @Override
    public List selectPedidoById(Pedido pedido) {
        String sql = "select clave,claveEmpresa,fecha,direccion,colonia,municipio,"
            + "codigoPostal,claveUsuario,notasRecibe,total,fechaPedido,fechaEntrega,"
            + "nombrePersonaEntregar,status from pedido"
            + " WHERE clave = :clave";
        SqlParameterSource parameterSource = new BeanPropertySqlParameterSource(pedido);
        return namedParameterJdbcTemplate.query(sql, parameterSource, ParameterizedBeanPropertyRowMapper.newInstance(Pedido.class));
        // Esta es otra forma sin utilizar la clase PedidoRowMapper	
    }

    @Override
    public List<Pedido> findAllPedidos() //throws EjecucionException{
    {// Esta consulta es equivalente
                 String sql = "select p.clave,e.nombre nombreE,direccion,colonia,municipio,"
                +"codigoPostal,u.nombre,mail,telefono,movil,total,fechaPedido,fechaEntrega," 
                 +"nombrePersonaEntregar from pedido p,usuario u,empresa e where p.claveUsuario=u.clave "
                         + "and p.claveEmpresa=e.clave;";
        
        SqlParameterSource parameterSource = new BeanPropertySqlParameterSource(Pedido.class);
       return namedParameterJdbcTemplate.query(sql, parameterSource, ParameterizedBeanPropertyRowMapper.newInstance(Pedido.class));
    
    }
}
